﻿using System;
using System.Collections.Generic;
using System.Data;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Unity;
using Microsoft.Practices.Unity;
using Vallejos.Datos.Factory;
using Vallejos.Datos.Servicios;
using Vallejos.Entidades.Interfaces;
using Vallejos.Entidades.ModeloDeDatos;
using Vallejos.Excepciones;

namespace Vallejos.Datos.Accesos
{
    public class SolicitudDAL : ISolicitud
    {
        private readonly DatabaseService _database;
        private readonly AnalisisCrediticioDAL _analisis;

        public SolicitudDAL()
        {
            var container = new UnityContainer()
                .AddNewExtension<EnterpriseLibraryCoreExtension>();
            _database = container.Resolve<DatabaseService>();
            _analisis = new AnalisisCrediticioDAL();
        }

        public List<EstadoDeAnalisis> LeerEstadosDeAnalisis(int idLenguaje)
        {
            var estados = new List<EstadoDeAnalisis>();

            var factory = new EstadoDeAnalisisFactory();

            try
            {
                using (var command = _database.GetStoredProcCommand("LeerEstadosDeAnalisis"))
                {
                    _database.AddInParameter(command, "Id_Lenguaje", DbType.Int32, idLenguaje);

                    using (var reader = _database.ExecuteReader(command))
                        while (reader.Read())
                            estados.Add(factory.Crear(reader));
                }
            }
            catch (Exception ex)
            {
                throw new ExcepcionDatos("Error desconocido", ex);
            }

            return estados;
        }

        public Solicitud LeerSolicitud(int idSolicitud)
        {
            Solicitud solicitud = null;

            var factory = new SolicitudFactory();

            try
            {
                using (var command = _database.GetStoredProcCommand("LeerSolicitud"))
                {
                    _database.AddInParameter(command, "Id_Solicitud", DbType.Int32, idSolicitud);

                    using (var reader = _database.ExecuteReader(command))
                        if (reader.Read())
                        {
                            solicitud = factory.Crear(reader);
                            if (solicitud.GetType() == typeof (SolicitudDeAnalisisCrediticio))
                                ((SolicitudDeAnalisisCrediticio) solicitud).Historial =
                                    _analisis.LeerHistorialDeSolicitudDeAnalisis(solicitud.Id);
                        }
                }
            }
            catch (Exception ex)
            {
                throw new ExcepcionDatos("Error desconocido", ex);
            }

            return solicitud;
        }
    }
}